package com.blog.cmrpersonalblog.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.blog.cmrpersonalblog.entity.EmailVerification;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.time.LocalDateTime;
import java.util.List;

/**
 * 邮箱验证码Mapper接口
 */
@Mapper
public interface EmailVerificationMapper extends BaseMapper<EmailVerification> {

    /**
     * 查找有效的验证码
     * @param email 邮箱
     * @param verificationCode 验证码
     * @param verificationType 验证类型
     * @return 验证码记录
     */
    EmailVerification selectValidVerification(@Param("email") String email,
                                            @Param("verificationCode") String verificationCode,
                                            @Param("verificationType") String verificationType);

    /**
     * 查询指定时间内的发送次数
     * @param email 邮箱
     * @param verificationType 验证类型
     * @param startTime 开始时间
     * @return 发送次数
     */
    Integer countSentInTimeRange(@Param("email") String email,
                               @Param("verificationType") String verificationType,
                               @Param("startTime") LocalDateTime startTime);

    /**
     * 查询今日发送次数
     * @param email 邮箱
     * @param today 今日开始时间
     * @return 今日发送次数
     */
    Integer countTodaySent(@Param("email") String email,
                         @Param("today") LocalDateTime today);

    /**
     * 使验证码失效
     * @param email 邮箱
     * @param verificationType 验证类型
     * @return 影响行数
     */
    Integer invalidateVerifications(@Param("email") String email,
                                  @Param("verificationType") String verificationType);

    /**
     * 清理过期验证码
     * @param expireTime 过期时间
     * @return 清理数量
     */
    Integer deleteExpiredVerifications(@Param("expireTime") LocalDateTime expireTime);

    /**
     * 获取用户最近的验证记录
     * @param email 邮箱
     * @param verificationType 验证类型
     * @param limit 限制数量
     * @return 验证记录列表
     */
    List<EmailVerification> selectRecentVerifications(@Param("email") String email,
                                                     @Param("verificationType") String verificationType,
                                                     @Param("limit") Integer limit);
}
